package com.unicom.proxy.jdkproxy;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @author liry
 * @version 1.0
 * @date Created on 2021/12/15 17:16
 * Description: 创建代理类
 */
public class JDKDynamicProxy implements InvocationHandler {

    public static final Logger log = LoggerFactory.getLogger(JDKDynamicProxy.class);

    // 定义被代理对象
    private Object target;

    public JDKDynamicProxy(Object target) {
        this.target = target;
    }


    /**
     * 实现 InvokeHandler 并重写 invoke方法用于被代理对象方法执行回调
     *
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 1. 执行数据库事务、日志等非业务功能
        log.info("------目标方法执行: before-------");
        // 2. 通过反射执行目标方法
        Object returnVal = method.invoke(target, args);
        // 3. 执行数据库事务、日志等非业务功能
        log.info("------目标方法执行: after--------");
        return returnVal;
    }

    // 创建代理对象
    public Object getProxy() {
        // 1. 获取被代理对象的ClassLoader
        ClassLoader classLoader = target.getClass().getClassLoader();
        // 2. 获取被代理类所实现的接口
        Class<?>[] interfaces = target.getClass().getInterfaces();
        // 3. 创建一个InvocationHandler用于代理方法执行回调invoke()
        // Thread.currentThread().getContextClassLoader()

        return Proxy.newProxyInstance(classLoader, interfaces, this);
    }
}
